//
//  HMUserAccountViewModel.swift
//  sina
//
//  Created by 崔正强 on 17/3/31.
//  Copyright © 2017年 崔正强. All rights reserved.
//

import UIKit

/*
 1.封装网络请求
 2.处理数据相关的逻辑
 3.数据缓存
 */

//一个应用在一个手机中一次可以登录多少个用户
private let userAccount_path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")


class HMUserAccountViewModel: NSObject {
    
    //全局有且只有一个登录用户
    static let shared: HMUserAccountViewModel = HMUserAccountViewModel()
    
    //需要持有一个模型对象 --> 处理数据
    var account: HMUserAccount?
    
    //访客令牌
    var accessToken: String?{
        //登录了
        if userLogin {
            return (account?.access_token)
        }
        //反之
        return nil
    }
    
    //在对单例对象实例化的时候 就给调用loadUserAccount方法的返回值给account赋值
    private override init() {
        super.init()
        //当用户没有登录 但是单例对象已经实例化的时候 account没有值 并且以后都不会再赋值
        self.account = self.loadUserAccount()
    }
    
    //用户头像的纯种的url头像
    var headURL: URL? {
        return URL(string: account?.avatar_large ?? "")!
    }
    
    //判断用户token是否过期
    //获取这个userLogin属性的时候 需不需要获取最新的比较结果
    var userLogin: Bool {
        
        //满足一下情况就认为登录
        if account?.access_token != nil && isExpires == false {
            return true
        }
        //默认用户没有登录
        return false
    }
    
    var isExpires: Bool {
        //是否过期 通过过期日期和当前日期比较
        if account?.expires_date?.compare(Date()) == .orderedDescending {
            return false
        }
        //默认过期
        return true
    }
    
    //请求用户授权token
    func loadAccessToken(code: String,finished: @escaping (Bool) -> ()) {
        let urlString = "https://api.weibo.com/oauth2/access_token"
        let para = ["client_id" : client_id,
                    "client_secret" : client_secret,
                    "grant_type" : "authorization_code",
                    "code" : code,
                    "redirect_uri" : redirect_uri]
        
        HMNetworkTools.shared.request(method: .POST, urlString: urlString, paramters: para) { (res, error) in
            if error != nil {
//                SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没网")
                //执行失败的回调
                finished(false)
                return
            }
            //已经获取了token --> 通过token获取用户信息
            //发起一个网络请求 -> 获取用户信息
            self.loadUserInfo(res as! [String : Any],loadUserInfoFinished: finished)
            
        }
    }
    
    //加载用户信息
    private func loadUserInfo(_  dict: [String : Any], loadUserInfoFinished: @escaping (Bool) -> ()) {
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        
        let para = ["access_token" : token,
                    "uid" : uid]
        HMNetworkTools.shared.request(method: .GET, urlString: urlString, paramters: para) { (res, error) in
            if error != nil {
//                SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没网")
                loadUserInfoFinished(false)
                return
            }
            var userInfoDict = res as! [String : Any]
            //需要将用户信息保存到本地 --> 方便下次使用的时候直接取
            //合并字典 -> 按需存储相关信息
            for (key,value) in dict {
                userInfoDict[key] = value
            }
            //存储用户登录信息 -> 将userInfoDict字典转模型
            let userAccount = HMUserAccount(dict: userInfoDict)
            
            //给单例对象的account赋值
            self.account = userAccount
            
//            //对userAccount做归档
//            //归档到沙盒
//            let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")
//            print(NSHomeDirectory())
//            NSKeyedArchiver.archiveRootObject(userAccount, toFile: path)
            self.saveUserAccount(account: userAccount)
            
            
            //当用户信息存储完毕之后再执行成功的回调
            loadUserInfoFinished(true)
            
        }
        
    }
    
    //对 userAccount 做归档
    private func saveUserAccount(account: HMUserAccount) {
        //归档到沙盒
        print(NSHomeDirectory())
        NSKeyedArchiver.archiveRootObject(account, toFile: userAccount_path)
    }
    
    //从沙盒通过解档的方法读取用户信息
    func loadUserAccount() -> HMUserAccount? {
        
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: userAccount_path)
        if let acc = account as? HMUserAccount {
            return acc
        }
        //默认获取不到数据
        return nil
    }
}
